package br.com.control;

/*
 *Classe de acesso ao banco de dados criada por Lucas de Souza Sales. 
 */

import android.R.string;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.*;
import android.database.Cursor;
import android.database.SQLException;

public class Banco {

	private static SQLiteDatabase bd = null;

	private static String _nomeBanco = "KRK";

	private static int _versaoBanco = 1;

	private BancoDados bdados;

	private final Context ctx;

	public static final String[] _sqlTabelaCli_Email = new String[] { "CREATE TABLE if not exists Cli_Email (CD_CLIENTE integer NOT NULL , EMAIL text NOT NULL)" };

	public static final String[] _sqlTabelaCli = new String[] { "CREATE TABLE if not exists Cli (CD_RET integer NOT NULL,"
			+ "NOME text NOT NULL,CPF_CNJP text NOT NULL,IE_RG text NOT NULL,"
			+ "ENDERECO text NOT NULL,NUMERO text NOT NULL,COMPLEMENTO text NOT NULL,"
			+ "BAIRRO text NOT NULL,CEP text NOT NULL,CIDADE text NOT NULL,UF text NOT NULL)" };

	public static final String[] _sqlTabelaPro = new String[] { "CREATE TABLE if not exists Pro (cod_ret integer NOT NULL,"
			+ "descricao,unid,saldo)" };

	public static final String[] _sqlTabelaReserva = new String[] { "CREATE TABLE if not exists Reserva(cod_prod integer NOT NULL,"
			+ "qtde,cod_vend,cod_cli,obs)" };

	public static final String[] _sqlTabelaCli_Fone = new String[] { "CREATE TABLE if not exists Cli_Fone(cod_cli integer NOT NULL,"
			+ "fone,nome_contato)" };

	public static final String[] _sqlTabelaC01 = new String[] { "CREATE TABLE if not exists C01 (CD_ROTA integer NOT NULL,"
			+ "DS_ROTA text NOT NULL);        " };

	public static final String[] _sqlTabelaC02 = new String[] { "CREATE TABLE if not exists C02 (CD_TRANSPORTADORA integer NOT NULL,"
			+ "NM_TRANSPORTADORA text NOT NULL, "
			+ "NM_ESTADO text NOT NULL,		  "
			+ "NM_CIDADE text NOT NULL);        " };

	public static final String[] _sqlTabelaC03 = new String[] { "CREATE TABLE if not exists C03 (CD_VENDEDOR integer NOT NULL,"
			+ "NM_VENDEDOR text NOT NULL);     " };

	public static final String[] _sqlTabelaC04 = new String[] { "CREATE TABLE if not exists C04 (CD_CLIENTE integer NOT NULL,"
			+ "NM_CLIENTE text NOT NULL,       "
			+ "NM_FANTASIA text DEFAULT '',    "
			+ "DS_ENDERECO text DEFAULT '',    "
			+ "NM_BAIRRO text DEFAULT '',      "
			+ "NM_CIDADE text DEFAULT '',      "
			+ "NM_ESTADO text DEFAULT '',      "
			+ "CD_ROTA integer NOT NULL,       "
			+ "NR_SEQ_ATEND integer NOT NULL,  "
			+ "VR_SALDO_LIMITE real DEFAULT 0, "
			+ "DS_SITUACAO text DEFAULT '',    "
			+ "NR_TELEFONE text DEFAULT '',    "
			+ "VR_LIMITE real DEFAULT 0,       "
			+ "NR_CEP text DEFAULT '',         "
			+ "NR_CNPJ_CPF text NOT NULL,      "
			+ "NR_CGF text DEFAULT '');        " };

	public static final String[] _sqlTabelaC05 = new String[] { "CREATE TABLE if not exists C05 (CD_CLIENTE integer NOT NULL,"
			+ "CD_TRANSPORTADORA integer NOT NULL); " };

	public static final String[] _sqlTabelaC06 = new String[] { "CREATE TABLE if not exists C06 (CD_VENDEDOR integer NOT NULL,"
			+ "CD_CLIENTE integer NOT NULL,      "
			+ "CD_ORG_VENDA text NOT NULL,       "
			+ "CD_TAB_PRECO integer NOT NULL,    "
			+ "CD_GRUPO_MPGTO integer NOT NULL); " };

	public static final String[] _sqlTabelaM01 = new String[] { "CREATE TABLE if not exists M01 (CD_GRUPO_MPGTO integer NOT NULL,"
			+ "DS_GRUPO text NOT NULL); " };

	public static final String[] _sqlTabelaM02 = new String[] { "CREATE TABLE if not exists M02 (CD_COND_PGTO integer NOT NULL,"
			+ "DS_COND_PGTO text NOT NULL,      "
			+ "QT_DIAS_TOTAL integer NOT NULL,  "
			+ "PR_DESCONTO real NOT NULL,       "
			+ "DS_DIAS_PARCELA text DEFAULT '', "
			+ "DS_PR_PARCELAS text DEFAULT ''); " };

	public static final String[] _sqlTabelaM03 = new String[] { "CREATE TABLE if not exists M03 (CD_MEIO_PGTO text NOT NULL,"
			+ "DS_MEIO_PGTO text NOT NULL); " };

	public static final String[] _sqlTabelaM04 = new String[] { "CREATE TABLE if not exists M04 (CD_GRUPO_MPGTO integer NOT NULL,"
			+ "CD_MEIO_PGTO text NOT NULL,     "
			+ "CD_COND_PGTO integer NOT NULL); " };

	public static final String[] _sqlTabelaM05 = new String[] { "CREATE TABLE if not exists M05 (CD_GRUPO_MPGTO integer NOT NULL,"
			+ "CD_ORG_VENDA text NOT NULL); " };

	public static final String[] _sqlTabelaM06 = new String[] { "CREATE TABLE if not exists M06 (CD_TITULO text NOT NULL,"
			+ "CD_CLIENTE integer NOT NULL, "
			+ "DT_LANCAMENTO text NOT NULL, "
			+ "VR_TITULO real NOT NULL,     "
			+ "DT_VENCIMENTO text NOT NULL, "
			+ "CD_MEIO_PGTO text NOT NULL); " };

	public static final String[] _sqlTabelaO01 = new String[] { "CREATE TABLE if not exists O01 (CD_PEDIDO_PALM integer PRIMARY KEY autoincrement NOT NULL,"
			+ "CD_CLIENTE integer NOT NULL,       "
			+ "DT_EMISSAO text NOT NULL,          "
			+ "VR_PEDIDO real NOT NULL,           "
			+ "CD_ORG_VENDA text NOT NULL,        "
			+ "CD_PEDIDO_CLIENTE text DEFAULT '', "
			+ "CD_PEDIDO integer,                 "
			+ "CD_COND_PGTO integer,              "
			+ "CD_TIPO_PEDIDO integer NOT NULL, 	"
			+ "DT_ENTREGA text DEFAULT '',      	"
			+ "CD_MEIO_PGTO text DEFAULT '',    	"
			+ "CD_ST_PEDIDO integer,            	"
			+ "ID_PRIORIDADE integer NOT NULL,  	"
			+ "CD_VENDEDOR integer NOT NULL,    	"
			+ "DT_EXPORTACAO text DEFAULT '',   	"
			+ "ID_TIPO_FRETE text NOT NULL,     	"
			+ "CD_TRANSPORTADORA integer,       	"
			+ "DS_OBSERVACAO text DEFAULT '',   	"
			+ "NM_RZ_SOCIAL_ENTR text NOT NULL, 	"
			+ "DS_ENDERECO_ENTR text NOT NULL,  	"
			+ "NM_BAIRRO_ENTR text NOT NULL,    	"
			+ "NM_ESTADO_ENTR text NOT NULL,    	"
			+ "NR_CEP_ENTR text NOT NULL,       	"
			+ "NR_FONE_ENTR text DEFAULT '',    	"
			+ "NR_CNPJ_CPF_ENTR text NOT NULL,  	"
			+ "NR_CGF_ENTR text DEFAULT '',     	"
			+ "CD_PEDIDO_PALM_PAI integer );    	" };

	public static final String[] _sqlTabelaO02 = new String[] { "CREATE TABLE if not exists O02 (CD_PEDIDO_PALM integer NOT NULL,"
			+ "CD_PRODUTO integer NOT NULL, "
			+ "QT_ITEM real NOT NULL,       "
			+ "VR_ITEM real NOT NULL); 	  " };

	public static final String[] _sqlTabelaO03 = new String[] { "CREATE TABLE if not exists O03 (CD_ST_PEDIDO integer NOT NULL,"
			+ "DS_ST_PEDIDO text NOT NULL,  " + "ID_APROVACAO text NOT NULL); " };

	public static final String[] _sqlTabelaP01 = new String[] { "CREATE TABLE if not exists P01 (CD_FAMILIA integer NOT NULL,"
			+ "NM_FAMILIA text NOT NULL,  " + "CD_FAMILIA_PAI integer);   " };

	public static final String[] _sqlTabelaP02 = new String[] { "CREATE TABLE if not exists P02 (CD_PRODUTO integer NOT NULL,"
			+ "NM_PRODUTO text NOT NULL,       "
			+ "DS_UNIDADE_BASE text NOT NULL,  "
			+ "QT_BASE real NOT NULL,          "
			+ "CD_FAMILIA integer NOT NULL,    "
			+ "QT_ESTOQUE real DEFAULT 0,      "
			+ "DS_OBS_PRODUTO text DEFAULT '', "
			+ "QT_UNIDADE real DEFAULT 1,      "
			+ "CD_REFERENCIA text DEFAULT ''); " };

	public static final String[] _sqlTabelaP03 = new String[] { "CREATE TABLE if not exists P03 (CD_ORG_VENDA text NOT NULL,"
			+ "CD_TAB_PRECO integer NOT NULL,   "
			+ "CD_PRODUTO integer NOT NULL,     "
			+ "CD_SEQUENCIAL integer NOT NULL); " };

	public static final String[] _sqlTabelaP04 = new String[] { "CREATE TABLE if not exists P04 (CD_SEQUENCIAL integer NOT NULL,"
			+ "QT_MIN_FAIXA real NOT NULL,      "
			+ "VR_PRECO_MINIMO real NOT NULL,   "
			+ "VR_PRECO_SUGERIDO real NOT NULL, "
			+ "VR_PRECO_MAXIMO real NOT NULL);  " };

	public static final String[] _sqlTabelaZ01 = new String[] { "CREATE TABLE if not exists Z01 (CD_ORG_VENDA text NOT NULL,"
			+ "NM_ORGANIZACAO text NOT NULL);  " };

	public static final String[] _sqlTabelaZ02 = new String[] { "CREATE TABLE if not exists Z02 (CD_SUPERVISOR integer NOT NULL,"
			+ "NM_SUPERVISOR text NOT NULL);  " };

	public static final String[] _sqlTabelaUsuario = new String[] { "CREATE TABLE if not exists usuarios (_ID integer PRIMARY KEY autoincrement NOT NULL,"
			+ "USU_MATRICULA text NOT NULL,      "
			+ "USU_NOME text NOT NULL,           "
			+ "USU_LOGIN text NOT NULL,          "
			+ "USU_SENHA text NOT NULL,      	   "
			+ "USU_COORDENADOR text,			   "
			+ "USU_ATIVO text NOT NULL,          "
			+ "USU_FL_ADMIN integer NOT NULL);   " };

	public static final String[] _sqlTabelaSessao = new String[] { "CREATE TABLE if not exists sessao (_ID integer PRIMARY KEY autoincrement NOT NULL,"
			+ "USU_MATRICULA text,  	   "
			+ "USU_NOME text,             "
			+ "ULTIMO_USU_LOGADO text,    " + "DATA text );			   " };

	public static final String[] _sqlTabelaUsuarioAux = new String[] { "CREATE TABLE if not exists usuariosAux (_ID integer PRIMARY KEY autoincrement NOT NULL,"
			+ "USU_NOME text NOT NULL);" };

	private static final String _sqlTabelaVersao = "create table versao (_id integer primary key autoincrement, "
			+ "nometabela text not null, versao integer not null);";

	private static final String _nomeTabelaVersao = "versao";

	/** campos para a tabela versao **/
	public static final String CHAVE = "_id";
	private static final String NOMETABELA = "nometabela";
	private static final String VERSAOTABELA = "versao";
	private static final String[] _colunas = { Banco.CHAVE, Banco.NOMETABELA,
			Banco.VERSAOTABELA };

	public static class BancoDados extends SQLiteOpenHelper {

		// instancia unica do dao
		private static BancoDados _instDAO;

		private BancoDados(Context context) {
			super(context, _nomeBanco, null, _versaoBanco);
		}

		public static BancoDados getDAO(Context ctx, String[] scriptSql,
				String nomeTabela) {
			if (_instDAO == null) {
				_instDAO = new BancoDados(ctx);
				try {
					bd = _instDAO.getWritableDatabase();
				} catch (SQLiteException e) {
					// lembrar de mensagem
				}

			}
			// verifica a quantidade de script para executar no banco de dados
			// da tabela
			Cursor _cursor = null;
			_cursor = _instDAO.selecionar(_nomeTabelaVersao, _colunas,
					Banco.NOMETABELA + "= ?", new String[] { nomeTabela },
					null, null, null, null);

			if (_cursor.getCount() > 0) {
				_cursor.moveToFirst();
				int _versaoTabela = _cursor.getInt(2);
				int qtdeScript = scriptSql.length;
				for (int i = _versaoTabela; i < qtdeScript; i++) {
					String sql = scriptSql[i];
					bd.execSQL(sql);
				}
				// atualiza a versao da tabela
				ContentValues _valores = new ContentValues();
				_valores.put(Banco.VERSAOTABELA, qtdeScript);
				_instDAO.atualizarDadosTabela(_nomeTabelaVersao,
						_cursor.getInt(0), _valores);

			} else {
				// cria uma linha na tabela versao caso nao exista com o nome da
				// tabela
				ContentValues _valores = new ContentValues();
				_valores.put(Banco.NOMETABELA, nomeTabela);
				_valores.put(Banco.VERSAOTABELA, 1);
				_instDAO.inserirRegistro("versao", _valores);

				// executa o script 0 da tabela
				String sql = scriptSql[0];
				bd.execSQL(sql);
			}
			_cursor.close();
			return _instDAO;
		}

		private Cursor selecionar(String table, String[] columns, String where,
				String[] argumentosWhere, String groupby, String having,
				String orderby, String limit) {
			return bd.query(table, columns, where, argumentosWhere, groupby,
					having, orderby, limit);
		}

		// atualiza uma linha de uma tabela
		public int atualizarDadosTabela(String tabela, long id,
				ContentValues valores) {
			return bd.update(tabela, valores, CHAVE + "=" + id, null);
		}

		public long inserirRegistro(String tabela, ContentValues valores) {
			return bd.insert(tabela, null, valores);

		}

		@Override
		public void onCreate(SQLiteDatabase bd) {

			try {
				bd.execSQL(_sqlTabelaVersao);
			} catch (SQLException e) {
				//
			}
		}

		@Override
		public void onUpgrade(SQLiteDatabase bd, int versaoAntiga,
				int versaoNova) {
			bd.execSQL("DROP TABLE IF EXISTS usuarios");
			bd.execSQL("DROP TABLE IF EXISTS usuariosAux");
			bd.execSQL("DROP TABLE IF EXISTS versao");
			onCreate(bd);
		}

	}

	public Banco(Context c) {
		this.ctx = c;
	}

	public Banco open() {
		bdados = new BancoDados(ctx);
		bd = bdados.getWritableDatabase();
		return this;
	}

	public void fechaBanco() {
		if (bd.isOpen()) {
			bdados.close();
		}
	}

	public long inserirRegistro(String tabela, ContentValues valores) {
		return bd.insert(tabela, null, valores);

	}

	public boolean ExecutaSql(String Sql) {
		try {
			open();
			bd.execSQL(Sql);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public Cursor consulta(String table, String[] columns, String where,
			String[] argumentosWhere, String groupby, String having,
			String orderby, String limit) {
		return bd.query(table, columns, where, argumentosWhere, groupby,
				having, orderby, limit);
	}

	public int atualizarDadosTabela(String tabela, long id,
			ContentValues valores) {
		return bd.update(tabela, valores, CHAVE + "=" + id, null);
	}

}
